#include <iostream>
using namespace std;

// 使用常引用可以保护参数不被修改
int my_add(const int &x, const int &y){
    //x = 1234; // 报错 因为不能通过const引用修改引用的目标
    return x+y;
}

int main(int argc, const char *argv[]){
    int a = 10;
    const int &r1 = a;

    cout << r1 << endl; // 10  读可以
    // r1 = 20; // 不允许修改
    a = 20; // 通过a自身是可以修改的 因为a没有被const修饰

    // 常引用可以用来引用常量
    // int &r2 = 100; //普通的引用不能引用常量
    const int &r3 = 100;
    cout << r3 << endl;

    // 常引用可以用来引用临时对象
    // 表达式的结果是一个临时对象 本来在使用后生命周期就结束了
    // 但是被常引用引用后  生命周期就被延长至和r4一样了
    const int &r4 = (1+2);

    int num1 = 100;
    int num2 = 200;
    cout << my_add(num1, num2) << endl; // 300

    // 引用被const修饰的变量时 也必须使用常引用
    const int value = 1234;
    const int &r5 = value;

    return 0;
}